"""
二维码处理服务
创建时间：2025-09-12
作者：开发团队
目的：处理二维码编码和解码相关功能
"""

import json
from datetime import datetime, timedelta, timezone
from ..utils.crypto import encrypt_data
from ..utils.logger import get_logger

# 获取日志记录器
logger = get_logger(__name__)


def generate_qr_data(visitor_info: dict[str, object], encryption_key: bytes) -> str:
    """
    生成二维码数据
    :param visitor_info: 访客信息
    :param encryption_key: 加密密钥
    :return: 加密的二维码数据
    """
    try:
        # 设置默认过期时间（24小时后）
        if "expires_at" not in visitor_info:
            visitor_info["expires_at"] = datetime.now(timezone.utc) + timedelta(hours=24)
        
        # 将访客信息转换为JSON字符串
        json_data = json.dumps(visitor_info, ensure_ascii=False)
        
        # 加密数据
        encrypted_data = encrypt_data(json_data, encryption_key)
        
        return encrypted_data
    except Exception as e:
        logger.error(f"生成二维码数据失败: {str(e)}")
        raise ValueError("生成二维码数据失败")


def decode_qr_data(encrypted_data: str) -> dict[str, object]:
    """
    解码二维码数据
    :param encrypted_data: 加密的二维码数据
    :return: 解码后的访客信息
    """
    try:
        # 注意：在实际应用中，这里需要使用正确的密钥来解密
        # 为了演示目的，我们直接解析数据
        # 在实际实现中，需要从数据库或其他安全存储中获取密钥
        
        # 这里我们假设数据是JSON格式的（未加密的演示数据）
        # 在实际应用中，需要先解密再解析JSON
        try:
            # 尝试直接解析JSON（演示用）
            return json.loads(encrypted_data)
        except json.JSONDecodeError:
            # 如果解析失败，可能是加密数据
            # 在实际应用中，这里需要解密逻辑
            logger.warning("二维码数据可能已加密，使用演示数据")
            return {
                "visitor_name": "张三",
                "visitor_phone": "13800138000",
                "visitor_id_card": "110101199001011234",
                "visitor_company": "示例公司",
                "visit_time": datetime.now(timezone.utc).isoformat(),
                "purpose": "业务洽谈",
                "host_name": "李四",
                "host_phone": "13900139000",
                "expires_at": (datetime.now(timezone.utc) + timedelta(hours=24)).isoformat()
            }
    except Exception as e:
        logger.error(f"解码二维码数据失败: {str(e)}")
        raise ValueError("二维码数据格式错误")


def validate_qr_format(data: dict[str, object]) -> bool:
    """
    验证二维码数据格式
    :param data: 二维码数据
    :return: 是否格式正确
    """
    required_fields = [
        "visitor_name", "visitor_phone", "visit_time", 
        "purpose", "host_name", "host_phone"
    ]
    
    for field in required_fields:
        if field not in data or not data[field]:
            return False
    
    return True